package commande;

import java.util.Properties;

import librairies.dictionnaire.dico.DicoListe;
import librairies.dictionnaire.interfaces.IDictionnaire;
import librairies.liste.interfaces.IListeE;
import librairies.liste.list.ListeDCE;
import modele.Mot;
import IO.properties.PropertiesLoader;
import IO.sortie.Out;
import IO.xml.XmlComprehension;

import commande.outils.Processus;

/**
 * permet de gerer la memoire des certaine donnees.
 * permet de ne pas recharger tous le temps les meme informations.
 * 
 * @author mlozach
 */
public class Outils 
{
	private static Outils instance;
	
	private IDictionnaire<Mot> comprehension_dico; 
	private Properties comprehension_properties;
	private IListeE<Processus> processus;
	private Out out;
	
	/**
	 * pour le singleton
	 */
	public static Outils getInstance() 
	{
		if (instance == null) instance = new Outils();
		return instance;
	}
	
	/**
	 * constructeur par defaut.
	 */
	private Outils() {}

	public void add(Processus process)
	{
		if(process == null) return;
		if(this.processus == null) this.processus = new ListeDCE<Processus>();
		this.processus.add(process);
	}
	
	/**
	 * permet de remplir le dictionnaire avec la comprehension.
	 */
	private void remplirDicoComprehension() 
	{
		this.comprehension_dico = new DicoListe<Mot>();
		XmlComprehension comphrension = XmlComprehension.getInstance();
		this.comprehension_dico.addWords(comphrension.lecture());
	}
	
	/**
	 * permet de remplir la properties avec la comprehension.
	 */
	private void remplirPropertiesComprehension() 
	{
		Lien lien = Lien.getInstance();
		this.comprehension_properties = PropertiesLoader.load(lien.getDossierProperties() + "comprehension.properties");
	}

	/**
	 * permet de recuperer le dico de comprehension.
	 * @return <comprehension>
	 */
	public IDictionnaire<Mot> getComprehensionDico() 
	{
		if(this.comprehension_dico == null) remplirDicoComprehension();
		return this.comprehension_dico;
	}
	
	/**
	 * permet de recuperer la properties de comprehension.
	 * @return <comprehension>
	 */
	public Properties getComprehensionProperties() 
	{
		if(this.comprehension_properties == null) remplirPropertiesComprehension();
		return this.comprehension_properties;
	}
	
	public void out(String value) 
	{
		if(this.out == null) this.out = Out.getInstance();
		this.out.sortieStandard(value);
	}
	
	public void out(IListeE<String> value) 
	{
		if(this.out == null) this.out = Out.getInstance();
		this.out.sortieStandard(value);
	}
}
